package es.uned.etsii.si3.taller.servlets;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.opensymphony.xwork2.ActionSupport;

import es.uned.etsii.si3.taller.Cliente;
import es.uned.etsii.si3.taller.EmpleadoTaller;
import es.uned.etsii.si3.taller.FactoriaDAO;
import es.uned.etsii.si3.taller.FactoriaFunciones;
import es.uned.etsii.si3.taller.ParteTrabajo;
import es.uned.etsii.si3.taller.Taller;
import es.uned.etsii.si3.taller.Usuario;
import es.uned.etsii.si3.taller.Vehiculo;
import es.uned.etsii.si3.taller.misc.ProporcionaFuncionalidad;

public class PTAvisos extends ActionSupport implements SessionAware {

	private static final long serialVersionUID = 1L;
	
	private 	Map<String, Object>	userSession;

	private 	Date 				fechaFin;
	public 		Date 				getFechaFin()	 						{ return this.fechaFin; }
	public 		void 				setFechaFin(Date d) 					{ this.fechaFin = d; }
	
	private 	ParteTrabajo		parteSeleccionado = null;
	public 		ParteTrabajo		getParteSeleccionado() 					{ return this.parteSeleccionado; }
	public 		void				setParteSeleccionado(ParteTrabajo pT) 	{ this.parteSeleccionado = pT; }

	private 	static int 			parteSeleccionadoID = -1;
	public 		int					getParteSeleccionadoID() 				{ return PTAvisos.parteSeleccionadoID; }
	public 		void				setParteSeleccionadoID(int i) 			{ PTAvisos.parteSeleccionadoID = i; }
	
	private 	List<ParteTrabajo>	listaPartes;		
	public		List<ParteTrabajo>	getListaPartes() 						{ return this.listaPartes; }
	public 		void				setListaPartes(List<ParteTrabajo> l)	{ this.listaPartes = l; }


	/**
	 * Carga la lista de partes pendientes de avisar al usuario
	 * @return  actionerror
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_TALLER_PENDIENTE_AVISO)	
	public String pTCargarAviso() {
		String res = SUCCESS;
		try {
			QueryBuilder<ParteTrabajo, Integer> parteQb = FactoriaDAO.getDao(ParteTrabajo.class).queryBuilder();
			Where<ParteTrabajo, Integer> wParteQb = parteQb.where();
			wParteQb.eq(ParteTrabajo.ID_TALLER_FIELD_NAME, this.getTallerSesionEmpleado());
			wParteQb.and().eq(ParteTrabajo.VISTOBUENO_FIELD_NAME, true);
			wParteQb.and().eq(ParteTrabajo.AVISADO_FIELD_NAME, false);
			
			QueryBuilder<Usuario, Integer> usuariosQb = FactoriaDAO.getDao(Usuario.class).queryBuilder();
			QueryBuilder<Cliente, Integer> clientesQb = FactoriaDAO.getDao(Cliente.class).queryBuilder();
			QueryBuilder<Vehiculo, Integer> vehiculosQb = FactoriaDAO.getDao(Vehiculo.class).queryBuilder();
			List<ParteTrabajo> lista = parteQb.join((usuariosQb).join(clientesQb)).join(vehiculosQb).query(); //.orderBy(ParteTrabajo.FECHAENTRADA_FIELD_NAME, true).query();
			Date hoy = new Date();
			this.setFechaFin(hoy);
			this.setListaPartes(lista);
		} catch (SQLException e) {
			addActionError("Error al localizar los vistos buenos pendientes de avisar: " + e);
			res = ERROR;
		}		
		return res;
	}
	
	/**
	 * Se marca el parte como avisado
	 * @return  actionerror
	 * @throws SQLException
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_TALLER_PENDIENTE_AVISO)	
	public String pTMarcarAviso() throws SQLException {
		String res = SUCCESS;
		this.setParteSeleccionadoID(this.getParteSeleccionadoID());
		this.setParteSeleccionado(FactoriaDAO.recuperar(ParteTrabajo.class, this.getParteSeleccionadoID()));
		this.parteSeleccionado.setTaller(this.getTallerSesionEmpleado());
		this.parteSeleccionado.setAvisado(true);
		try {				
			this.parteSeleccionado.update();
		} catch (SQLException e) {
			addActionError("Error al marcar el aviso: " + e);
			res = ERROR;
		}
		return res;
	}

	private Taller getTallerSesionEmpleado() {
		Taller res = null;
		Usuario uS = (Usuario) userSession.get("usuario");
		QueryBuilder<EmpleadoTaller, Integer> eTQb;
		try {
			eTQb = FactoriaDAO.getDao(EmpleadoTaller.class).queryBuilder();
			Where<EmpleadoTaller, Integer> wETQb = eTQb.where();			
			wETQb.eq(EmpleadoTaller.ID_USUARIO_FIELD_NAME, uS.getId());			
			List<EmpleadoTaller> lista = wETQb.query();
			res = lista.get(0).getTaller();
		} catch (SQLException e) {
			addActionError("Error al buscar taller: " + e);
		}			
		return res;
	}

	
	@Override
	public void setSession(Map<String, Object> session) {
		userSession = session;		
	}

}
